這一篇,我們將結合 FastAPI 的基礎,來製作第一個屬於自己的簡單小 Agent。這個 Agent 雖然簡單,但它將具備「感知」、「決策」和「行動」的核心特徵,讓我們能親身體驗 Agent 的運作方式。
在開始實作之前,讓我們來快速回顧 Agent 的三個核心特徵:
我們的第一個小 Agent 將會是一個「簡單的問候 Agent」。它的目標是根據接收到的名字,回傳一個客製化的問候語。
這個問候 Agent 的運作邏輯如下:
我們將使用 FastAPI 來實現這個 Agent 的 API 介面。
在你的專案資料夾中,建立一個名為 HelloAgent.py 的檔案,並輸入以下程式碼:
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
app = FastAPI(
    title="問候 Agent API",
    description="一個簡單的 AI Agent,用於生成客製化問候語。",
    version="1.0.0",
)
class GreetingRequest(BaseModel):
    name: str
@app.post("/greet")
async def greet_user(request: GreetingRequest):
    """
    呼叫問候 Agent,根據提供的名字回傳客製化問候語。
    """
    try:
        # 1. 感知環境:接收到請求中的名字
        user_name = request.name
        # 2. 決策與行動:根據名字生成問候語
        greeting_message = generate_greeting(user_name)
        # 3. 目標導向:回傳問候語以完成「問候」的目標
        return {"greeting": greeting_message}
    except Exception as e:
        raise HTTPException(status_code=500, detail=f"發生錯誤:{e}")
    
# 定義問候 Agent 的核心邏輯函式
def generate_greeting(name: str) -> str:
    """
    根據輸入的名字生成一個問候語。
    """
    if not name:
        # 如果名字為空,則回傳通用問候
        return "Hello there! What's your name?"
    else:
        # 如果有名字,則回傳客製化問候
        return f"Hello, {name}! Nice to meet you."
讓我們看看這段程式碼如何體現 AI Agent 的核心特徵:
感知環境 (Perception):
@app.post("/greet") 定義了一個 API 端點,它會接收外部傳來的 HTTP 請求。request: GreetingRequest 表示 Agent 期望接收一個包含 name 欄位的資料物件。當有請求進來時,FastAPI 會自動解析請求主體,將 name 值提取出來,這就是 Agent 的「感知」過程。決策與行動 (Decision & Action):
generate_greeting(user_name) 的函式是 Agent 的「決策」核心。它會判斷 user_name 是否為空。"Hello there! What's your name?" 或 "Hello, {name}! Nice to meet you.")。return {"greeting": greeting_message} 則是 Agent 將其「行動」結果回傳給呼叫者。目標導向 (Goal-Oriented):
greet_user 函式的設計,都是為了達成「根據輸入的名字,回傳一個友善的問候語」這個明確的目標。無論輸入是什麼,Agent 都會努力回傳一個問候語。在終端機中,切換到你的專案資料夾,然後執行以下指令:
uvicorn HelloAgent:app --host 127.0.0.1 --port 5678 --reload
當看到伺服器啟動訊息後,問候 Agent 就已經開始運行了
接著來測試 Agent,打開網頁瀏覽器,訪問:
http://localhost:5678/docs
你會看到自動生成的 API 文件。
/greet 這個 POST。{
  "name": "string"
}
 
"string" 改成你的名字 (例如 "Bob"):
{
  "name": "Bob"
}
 
{"greeting": "Hello, Bob! Nice to meet you."} 
name 留空並點擊「Execute」後則會是顯示 Hello there! What's your name? 
    {
      "name": ""
    }
    {
      "name": " "
    }
"" (空字串) 才算空值," " (一個空白)還是會被視為有內容這樣我們就成功的模擬並運行了第一個模擬的 Agent 了。雖然它只是一個簡單的問候 Agent,但它完整地展示了 Agent 的核心運作流程:感知、決策、行動,並透過 API 實現了與外部世界的互動。
這個基礎非常重要,因為未來我們所有的複雜 Agent,都可能建立在類似的邏輯上。